#ifndef _ITEM_MANANGER_H_
#define _ITEM_MANANGER_H_

#include "Common.h"
#include "Resource.h"
#include "ResourceManager.h"
#include "Singleton.h"
#include "String.h"
#include "ScriptFiles.h"

//兑换券
typedef struct game_exchange_tag_
{

/* !#AUTO DATABASE TABLE GAME_EXCHANGE ST_DEF */
	
		/* '兑换券id'*/
		uint32 	exchange_id;
		/* '兑换券组id'*/
		uint32 	group_id;
		/* '兑换id'*/
		String 	token;
		/* '兑换券名称'*/
		String 	name;
		/* '兑换券状态 0 无效 1 生效 2 已经兑换'*/
		uint32 	status;
		/* '创建时间'*/
		String 	create_time;
		/* '过期时间'*/
		String 	end_time;
		/* '创建者 ，标识不同的来源对象'*/
		uint32 	source;
		/* '兑换对象'*/
		uint32 	token_user;
		/* '兑换时间'*/
		String 	token_time;
		/* '兑换券描述'*/
		String 	desc;
		/* '物品1模式id'*/
		uint32 	item_model1;
		/* '---'*/
		uint32 	item_id1;
		/* '物品名称，来源于模式表'*/
		String 	item_name1;
		/* '---'*/
		String 	item_desc1;
		/* '---'*/
		uint32 	script_id1;
		/* '创建物品的数量'*/
		uint32 	item_num1;
		/* '物品模式id'*/
		uint32 	item_model2;
		/* '---'*/
		uint32 	item_id2;
		/* '物品名称'*/
		String 	item_name2;
		/* '---'*/
		String 	item_desc2;
		/* '---'*/
		uint32 	script_id2;
		/* '数量'*/
		uint32 	item_num2;
		/* '物品模式id'*/
		uint32 	item_model3;
		/* '---'*/
		uint32 	item_id3;
		/* '物品名称'*/
		String 	item_name3;
		/* '---'*/
		String 	item_desc3;
		/* '---'*/
		uint32 	script_id3;
		/* '数量'*/
		uint32 	item_num3;
		/* '物品模式id'*/
		uint32 	item_model4;
		/* '---'*/
		uint32 	item_id4;
		/* '物品名称'*/
		String 	item_name4;
		/* '---'*/
		String 	item_desc4;
		/* '---'*/
		uint32 	scirpt_id4;
		/* '数量'*/
		uint32 	item_num4;
		/* '无符号保留数据'*/
		uint32 	data1;
		/* '无符号保留数据2'*/
		uint32 	data2;
		/* '无符号保留数据3'*/
		uint32 	data3;
		/* '整数保留数据4'*/
		int32 	data4;
		/* '字符保留数据1'*/
		String 	sdata1;
		/* '字符保留数据2'*/
		String 	sdata2;
		/* '用户保留数据'*/
		String 	info;
/* #END DATABASE */
}GameExchange;

//商品
typedef struct game_goods_tag_
{

/* !#AUTO DATABASE TABLE GAME_GOODS ST_DEF */
	
		/* '商品id'*/
		uint32 	goods_id;
		/* '商城组id'*/
		uint32 	group_id;
		/* '商品创建时间'*/
		String 	create_time;
		/* '商品过期时间'*/
		String 	end_time;
		/* '商品名称 默认来至于模式表'*/
		String 	name;
		/* '物品模式id'*/
		uint32 	model_id;
		/* '商品状态 0 无效状态 1 一般状态 2 折扣状态 3 冻结 4 缺货补充'*/
		uint32 	status;
		/* '商品标志  0x01 新上市 0x02 推荐 0x04 热卖'*/
		uint32 	flag;
		/* '原始价格'*/
		uint32 	org_price;
		/* '价格'*/
		uint32 	price;
		/* '物品创建的脚本号'*/
		uint32 	script_id;
		/* '创建效果的模式号'*/
		uint32 	effect_id;
		/* '库存数量'*/
		uint32 	num;
		/* '最大库存数量'*/
		uint32 	max_num;
		/* '图片的资源id 来源于模式表'*/
		uint32 	id;
		/* '物品的类型 1 一般物品 2 装备 3 道具 4 人物形象'*/
		uint32 	type;
		/* '子类型'*/
		uint32 	sub_type;
		/* '游戏分区id'*/
		uint32 	gz_id;
		/* '供应商id'*/
		uint32 	sup_id;
		/* '商品描述，默认来自于模式表'*/
		String 	desc;
/* #END DATABASE */
}GameGoods;

//库存记录
typedef struct game_record_tag_
{

/* !#AUTO DATABASE TABLE GAME_RECORD ST_DEF */
	
		/* '用户消费记录'*/
		uint32 	record_id;
		/* '组id'*/
		uint32 	group_id;
		/* '记录状态 0 无效状态 1 一般状态 2 冻结状态 3 争议处理状态 '*/
		uint32 	status;
		/* '类型 0 无效类型 1 消费类型 2 充值类型 3转账类型'*/
		uint32 	type;
		/* '用户id'*/
		uint32 	user_id;
		/* '消费价格'*/
		uint32 	price;
		/* '消费数量'*/
		uint32 	num;
		/* '购买商品的id'*/
		uint32 	good_id;
		/* '购买时间'*/
		String 	create_time;
		/* '备注'*/
		String 	info;
		/* '问题处理时间'*/
		String 	process_time;
		/* '问题处理原因'*/
		String 	process_info;
		/* '记录处理结束时间'*/
		String 	end_time;
		/* '物品模式表'*/
		uint32 	item_model_id;
		/* '物品名称'*/
		String 	item_name;
		/* '物品描述，来至物品表'*/
		String 	item_desc;
		/* '购买物品资源id 来源是物品模式表购买物品资源id 来源是物品模式表'*/
		uint32 	item_id;
		/* '生成商品的脚本id'*/
		uint32 	script_id;
/* #END DATABASE */
}GameRecord;


class ScriptFile;
class MakingScriptFile;
class ItemPtr;

class  ItemManager: public ResourceManager,public Singleton<ItemManager>
{
public:
	ItemManager();
	~ItemManager();

	String	getItemStringName(const uint32 & serial);
	uint32	getItemUid(uint32 sid,const String & name);
	
	ResourcePtr  create(const uint32 & serial,const NameValuePairList* params = 0);
	ResourceCreateOrRetrieveResult  \
		createOrRetrieve(const uint32 & serial,const NameValuePairList* params = 0);
	ResourcePtr  load(const uint32 & serial);
	ResourcePtr     reload(ResourceHandle handle);
	//user manager start
	void	Startup(const uint32 & gid,bool isBattle = true);
	void 	Shutdown(void);

	//用于得到一个Item结构，用于向数据库追加新物品的记录
	Resource * newDumyItem(const uint32 & model_id);
	void	freeDumyItem(Resource * dumy);

	//根据模板向数据库插入新的记录，返回插入的记录 并执行载入
	ResourcePtr	loadItemDatabase(Resource * dumy);
	//根据模板向数据库插入新的纪录，返回插入的记录 不执行载入
	ResourcePtr	createItemDatabase(Resource * dumy);

	//根据查询，返回符合条件的记录 offset 为翻页起点 limitcount 为取回角色最大数量 query 为查询条件在 WHERE之后
	bool	getItemsList(std::list<ItemPtr> * items,const uint32 & offset,const uint32 & limitcount,const char * query,...);

	//根据查询条件返回一个查询结果数量 query 为在WHERE之后的SQL语句
	uint32	getDBCount(const char * query,...);
	
	bool	isBattleServer(void)	{	return m_battle_server;	}

	ResourcePtr	CreateScript(const uint32 & index);
	ResourcePtr	LoadScript(const uint32 & index);
	ScriptFile    *  getScriptFile(void)	{	return m_scriptFile;	}

        //返回 section 为 "UINT32_LIST_%u" 的整形
        uint32  getScriptUInt32List(const uint32 & index);
        //返回 section 为 "INT32_LIST_%u" 的整形
        int32  getScriptInt32List(const uint32 & index);
        //返回 section 为 "FLOAT_LIST_%u" 的浮点
        float getScriptFloatList(const uint32 & index);
        //返?? section 为 "STRING_LIST_%u" 的字符
        String getScriptStringList(const uint32 & index);
	


	//兑换券相关数据操作
	//根据结构添加兑换券信息
	GameExchange  * newDumyExchange(void);
	void 	freeDumyExchange(GameExchange * dumy);

	uint32	createExchangeDB(GameExchange * exc);

	//根据结构更新兑换券信息
	bool	updateExchangeDB(GameExchange * exc,const char * where = "");
	//根据兑换券ID，删除数据库
	bool	deleteExchangeDB(const uint32 & exchange_id);
	//根据兑换券 密码 删除数据库
	bool	deleteExchangeDB(const String & token);
	//根据兑换券ID，得到兑换券信息
	bool	getExchangeDB(const uint32 & exchange_id, GameExchange * exc);
	//根据兑换券Token 得到兑换券信息
	bool	getExchangeDB(const String & token, GameExchange * exc);
	//根据查询条件，返回查询结果
	bool	getExchangeListDB(std::list<GameExchange> * exchanges,const uint32 & offset,const uint32 & limitcount,const char * query,...);
	//根据查询条件 返回查询数量
	uint32	getExchangeDBCount(const char * query,...);

	//大汉商城货物表
	//根据结构添加商品信息
	GameGoods *  newDumyGoods(void);
	void	freeDumyGoods(GameGoods * goods);

	uint32	createGoodsDB(GameGoods * goods);
	//根据结构更新商品信息
	bool	updateGoodsDB(GameGoods * goods);
	//根据商品ID，删除数据库
	bool	deleteGoodsDB(const uint32 & goodshange_id);
	//修改货品数量，直接SQL语句修改，避免线程中库存错误
	bool	modfiyGoodsNum(const uint32 goods_id, const int32 & modNum);

	//根据商品 密码 删除数据库
	bool	deleteGoodsDB(const String & token);
	//根据商品ID，得到商品信息
	bool	getGoodsDB(const uint32 & goodshange_id, GameGoods * goods);
	//根据查询条件，返回查询结果
	bool	getGoodsListDB(std::list<GameGoods> * goods,const uint32 & offset,const uint32 & limitcount,const char * query,...);
	//根据查询条件 返回查询数量
	uint32	getGoodsDBCount(const char * query,...);

	//大汉商城货物进出库记录表
	GameRecord * newDumyRecord(const uint32 & goods_id);
	void	freeDumyRecord(GameRecord * record);

	//根据结构添加记录信息
	uint32	createRecordDB(GameRecord * record);
	//根据结构更新记录信息
	bool	updateRecordDB(GameRecord * record);
	//根据记录ID，删除数据库
	bool	deleteRecordDB(const uint32 & recordhange_id);
	//根据记录 密码 删除数据库
	bool	deleteRecordDB(const String & token);
	//根据记录ID，得到记录信息
	bool	getRecordDB(const uint32 & recordhange_id, GameRecord * record);
	//根据查询条件，返回查询结果
	bool	getRecordListDB(std::list<GameRecord> * records,const uint32 & offset,const uint32 & limitcount,const char * query,...);
	//根据查询条件 返回查询数量
	uint32	getRecordDBCount(const char * query,...);


	ResourcePtr   newDBObject(void);
	ResourcePtr   getDBObjectByHandle(const uint32 & handle);
	bool	getDBObjects(std::list<ResourcePtr> * objs,const uint32 & offset,const uint32 & limitcount,const char * query,...);


	
	const making_item_st *	getMaking(const uint32 & index);

protected:
	uint32		m_default_gid;
	String		m_default_group;
	bool		m_battle_server;
	ScriptFile    * m_scriptFile;
	MakingScriptFile	* m_makingScriptFile;

       /// @copydoc ResourceManager::createImpl
        Resource* createImpl(const String& name, ResourceHandle handle,
            const String& group, bool isManual, ManualResourceLoader* loader,
            const NameValuePairList* createParams);
};



#define   sItemMgr   ItemManager::getSingleton()

#endif
